﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ENProyecto7;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Configuration;
using System.Threading;

namespace WebProyectoSIETE
{
    public partial class Batalla : System.Web.UI.Page
    {
        // Variables globales
        // Variables Personaje
        private double fuerzaPersonaje;
        private double vidaPersonaje;
        private double defensaPersonaje;

        // Variables Enemigo
        private int ataqueEnemigo;
        private int vidaEn;
        private int defensaEnemigo;

        protected void Page_Load(object sender, EventArgs e)
        {

            // Si no viene de un postback, lo ejecuta, es decir, inicializa al principio.
            if (!Page.IsPostBack)
            {
                // Comprobar que el usuario se haya logueado
                if (Session["Usuario"] != null)
                {
                    Session["formaSalir"]=0;
                    try
                    {
                        // Abrir la conexion con la base de datos
                        //conexion.Open();

                        // Obtener los datos del enemigo
                        ENEnemigo enemigo = new ENEnemigo();
                        enemigo.IdEnemigo = int.Parse(Session["idEnemigo"].ToString());
                        enemigo.obtenerEnemigo();

                        // Obtener los datos del enemigo
                        if ((enemigo.ImagenEnemigo == "") || (enemigo.ImagenEnemigo == null))
                        {
                            imagenEnemigo.ImageUrl = "~/img/calavera-skull.jpg";
                        }
                        else
                        {
                            imagenEnemigo.ImageUrl = "~/img/" + enemigo.ImagenEnemigo;
                        }
                        lbEnemigo.Text = enemigo.NombreEnemigo;
                        Session["ataqueEnemigo"] = enemigo.AtaqueEnemigo;
                        Session["vidaEnemigo"] = enemigo.VidaEnemigo;
                        Session["defensaEnemigo"] = enemigo.DefensaEnemigo;
                        Session["puntosEnemigo"] = enemigo.PuntosEnemigo;

                        // Obtener los datos del usuario
                        ENUsuario usuario = new ENUsuario();
                        usuario.IdUsuario = int.Parse(Session["idUsuario"].ToString());
                        usuario.obtenerUsuario();

                        // Obtener los datos resultado del usuario
                        Session["experienciaActual"] = usuario.ExperienciaUsuario;

                        // Obtener los datos del personaje
                        ENPersonaje personaje = new ENPersonaje();
                        personaje.IdPersonaje = usuario.PersonajeUsuario;
                        personaje.obtenerPersonaje();

                        // Calcular las estadisticas del personaje segun su nivel
                        fuerzaPersonaje = (usuario.NivelUsuario * 3.5) + personaje.AtaquePersonaje;
                        vidaPersonaje = (usuario.NivelUsuario * 3.5) + personaje.VidaPersonaje;
                        Session["vidaPersonaje"] = vidaPersonaje;
                        Session["vidaInicial"] = vidaPersonaje;
                        defensaPersonaje = (usuario.NivelUsuario * 3.5) + personaje.DefensaPersonaje;

                        // Obtener el ataque del arma para sumarlo
                        ENObjeto obj = new ENObjeto();
                        Session["fuerzaPersonaje"] = fuerzaPersonaje + obj.obtenerAtaqueMax(usuario.IdUsuario);

                        // Obtener el ataque del arma para sumarlo
                        Session["defensaPersonaje"] = defensaPersonaje + obj.obtenerDefensaMax(usuario.IdUsuario);

                        // Generar la vida del enemigo
                        for (int i = 0; i < enemigo.VidaEnemigo/10; i++)
                        {
                            // Salto de linea a los 25 cuadrados
                            if (i % 25 == 0)
                            {
                                Literal Literal1 = new Literal();
                                Literal1.Text = "<br />";
                                phVidaEnemigo.Controls.Add(Literal1);
                            }
                            Image vidaEnem = new Image();
                            // Crear la imagen y asignarle atributos
                            vidaEnem.ID = "vidaEnem" + i;
                            vidaEnem.ImageUrl = "img/imgVidaEnemigo.png";

                            // Se añaden a los PlaceHolders
                            phVidaEnemigo.Controls.Add(vidaEnem);
                        }
                        // Generar la vida del personaje
                        for (int i = 0; i < vidaPersonaje/10; i++)
                        {
                            // Salto de linea a los 25 cuadrados
                            if (i % 25 == 0)
                            {
                                Literal Literal1 = new Literal();
                                Literal1.Text = "<br />";
                                phVidaPersonaje.Controls.Add(Literal1);
                            }
                            Image vidaPerson = new Image();
                            // Crear la imagen y asignarle atributos
                            vidaPerson.ID = "vidaPersonaje" + i;
                            vidaPerson.ImageUrl = "img/imgVida.png";

                            // Se añaden a los PlaceHolders
                            phVidaPersonaje.Controls.Add(vidaPerson);
                        }

                    }
                    catch (Exception ex)
                    {
                    }
                    finally
                    {
                        //conexion.Close();
                    }
                }
                else
                {
                    Response.Redirect("Default.aspx");
                }
            }
            else
            {

                // Generar la vida del enemigo
                phVidaEnemigo.Controls.Clear();
                for (int i = 0; i < (int.Parse(Session["vidaEnemigo"].ToString())/10); i++)
                {
                    // Salto de linea a los 25 cuadrados
                    if (i % 25 == 0)
                    {
                        Literal Literal1 = new Literal();
                        Literal1.Text = "<br />";
                        phVidaEnemigo.Controls.Add(Literal1);
                    }
                    Image vidaEnem = new Image();
                    // Crear la imagen y asignarle atributos
                    vidaEnem.ID = "vidaEnem" + i;
                    vidaEnem.ImageUrl = "img/imgVidaEnemigo.png";

                    // Se añaden a los PlaceHolders
                    phVidaEnemigo.Controls.Add(vidaEnem);

                }
                // Generar la vida del personaje
                phVidaPersonaje.Controls.Clear();
                for (int i = 0; i < ((int)double.Parse(Session["vidaPersonaje"].ToString())/10); i++)
                {
                    // Salto de linea a los 25 cuadrados
                    if (i % 25 == 0)
                    {
                        Literal Literal1 = new Literal();
                        Literal1.Text = "<br />";
                        phVidaPersonaje.Controls.Add(Literal1);
                    }
                    Image vidaPerson = new Image();
                    // Crear la imagen y asignarle atributos
                    vidaPerson.ID = "vidaPersonaje" + i;
                    vidaPerson.ImageUrl = "img/imgVida.png";

                    // Se añaden a los PlaceHolders
                    phVidaPersonaje.Controls.Add(vidaPerson);
                }
                if(int.Parse(Session["formaSalir"].ToString())==1){
                    // Hace una pausa de 5 segundos
                    Thread.Sleep(5000);
                    // Redirecciona
                    Response.Redirect("Localizacion.aspx");
                }
                else if (int.Parse(Session["formaSalir"].ToString()) == 2)
                {
                    // Hace una pausa de 5 segundos
                    Thread.Sleep(5000);
                    // Redirecciona
                    Response.Redirect("JugarUsuario2.aspx");
                }
            }
        }

        protected void btnAccion_Click(object sender, EventArgs e)
        {
            string logBatalla = "";
            bool defiende = false,vivo=true;
            double daño;
            // Recuperar los valores
            // Del personaje
            fuerzaPersonaje = double.Parse(Session["fuerzaPersonaje"].ToString());
            defensaPersonaje = double.Parse(Session["defensaPersonaje"].ToString());
            vidaPersonaje = double.Parse(Session["vidaPersonaje"].ToString());
            
            // Del Enemigo
            ataqueEnemigo = int.Parse(Session["ataqueEnemigo"].ToString());
            defensaEnemigo = int.Parse(Session["defensaEnemigo"].ToString());
            vidaEn = int.Parse(Session["vidaEnemigo"].ToString());


            if (lbAccion.Text == "Atacar") {
                logBatalla += "Decidiste atacar al enemigo.\r\n";

                daño = fuerzaPersonaje - (defensaEnemigo / 2);
                // Si la defensa del enemigo es mayor que el ataque del personaje, este no afecta al enemigo
                if (daño > 0)
                {
                    // Se calcula el daño
                    vidaEn = vidaEn - (int)daño;
                    // Si le resta toda la vitalidad, vence, le sube la experiencia al usuario y le redirecciona
                    if (vidaEn <= 0)
                    {
                        Session["puntos"]=int.Parse(Session["puntosEnemigo"].ToString())*2;
                        phVidaEnemigo.Controls.Clear();
                        logBatalla += "¡Venciste!\r\nGanaste " + Session["puntosEnemigo"] + " puntos de experiencia.\r\n";
                        // Se actualiza el log de la batalla
                        tbLogBatalla.Text = logBatalla;
                        vivo = false;

                        try
                        {
                            ENUsuario usuario = new ENUsuario();
                            usuario.actualizarExp((int)Session["experienciaActual"] + (int)Session["puntosEnemigo"], Session["idUsuario"].ToString());
                        }
                        catch (Exception ex)
                        {
                        }

                        lbAccion.Visible = false;
                        btnAccion.Text = "Volver";
                        btnAccion.PostBackUrl = "Localizacion.aspx";
                    }
                    else
                    {
                        Session["vidaEnemigo"] = vidaEn;
                    }
                }
            }
            else if (lbAccion.Text == "Defender") {
                defiende = true;
                logBatalla += "Decidiste defenderte de los ataques.\r\n";
            }
            else if (lbAccion.Text == "Usar_Pocion") {
                logBatalla += "Buscaste en tu petate...\r\n";

                try
                {
                    ENObjeto obj = new ENObjeto();
                    int curacion = obj.usarPocion(int.Parse(Session["idUsuario"].ToString()));

                    if (curacion == 0)
                    {
                        logBatalla += "...pero no encontraste ninguna poción.\r\n";
                    }
                    else 
                    {
                        Session["vidaPersonaje"] = int.Parse(Session["vidaPersonaje"].ToString()) + curacion;
                        if (int.Parse(Session["vidaInicial"].ToString()) < int.Parse(Session["vidaPersonaje"].ToString()))
                        {
                            logBatalla += "Al beberla no sentiste nada.";
                            Session["vidaPersonaje"] = Session["vidaInicial"];
                        }
                        else 
                        {
                            logBatalla += "¡Recuperaste parte de tu salud!\r\n";
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            else if (lbAccion.Text == "Huir") {
                Random consigue = new Random();

                logBatalla += "Elegiste huir y...\r\n";

                // Si lo consigue, se actualiza el log y el sistema hace una pausa, para luego redireccionarlo
                if(consigue.Next(100) >= 70){

                    logBatalla += "¡Lo conseguiste!\r\n";

                    // Se actualiza el log de la batalla
                    tbLogBatalla.Text = logBatalla;

                    lbAccion.Visible = false;
                    btnAccion.Text = "Volver";
                    btnAccion.PostBackUrl = "Localizacion.aspx";
                }
                else{
                    logBatalla += "no lo conseguiste...\r\n";
                }

            }

            // El enemigo siempre ataca.
            if (vivo)
            {
                if (defiende)
                {
                    daño = ataqueEnemigo - defensaPersonaje;
                }
                else
                {
                    daño = ataqueEnemigo - (defensaPersonaje / 2);
                }


                logBatalla += lbEnemigo.Text + " te atacó.\r\n";

                // Si la defensa del enemigo es mayor que el ataque del personaje, este no afecta al enemigo
                if (daño > 0)
                {
                    // Se calcula el daño real para los 30 cuadrados
                    vidaPersonaje = vidaPersonaje - (int)daño;

                    // Si le resta toda la vitalidad, pierde, se informa al usuario, y se le redirecciona
                    if (vidaPersonaje <= 0)
                    {
                        phVidaPersonaje.Controls.Clear();
                        logBatalla += "Has caido inconsciente.\r\n";
                        // Se actualiza el log de la batalla
                        tbLogBatalla.Text = logBatalla;

                        lbAccion.Visible = false;
                        btnAccion.Text = "Volver";
                        btnAccion.PostBackUrl = "JugarUsuario2.aspx";
                    }
                    else
                    {
                        Session["vidaPersonaje"] = vidaPersonaje;
                    }
                }
            }

            // Se actualiza el log de la batalla
            tbLogBatalla.Text = logBatalla;
        }
    }
}